﻿#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
给定一种规律 pattern 和一个字符串 s ，判断 s 是否遵循相同的规律。
这里的 遵循 指完全匹配，例如， pattern 里的每个字母和字符串 s 中的每个非空单词之间存在着双向连接的对应规律。
示例1:
输入: pattern = "abba", s = "dog cat cat dog"
输出 : true
示例 2 :

    输入 : pattern = "abba", s = "dog cat cat fish"
    输出 : false

    
bool wordPattern(char* pattern, char* str) {
    bool ans = false;
    int i, j, k, flag = 1;
    int s_len = strlen(str);
    char** pat = (char**)calloc(26, sizeof(char*));
    for (i = 0; i < 26; ++i)
        pat[i] = (char*)calloc(s_len + 1, sizeof(char));
    if (s_len > 0)
    {
        char* temp = (char*)calloc(s_len + 1, sizeof(char));
        for (i = 0, j = 0, k = 0; i <= s_len && k < strlen(pattern) && flag; ++i)
        {
            // str[i] == '\0'--> 为了比较最后一个单词
            if (str[i] == ' ' || str[i] == '\0')
            {
                // pattern串中该字符不是第一次出现
                if (strlen(pat[pattern[k] - 'a']) > 0)
                {
                    if (strcmp(pat[pattern[k] - 'a'], temp) != 0)
                    {
                        flag = 0;
                        break;
                    }
                }
                // pattern串中该字符第一次出现
                else
                {
                    // 为了解决pattern = "abba", str = "dog dog dog dog"                                     // 这种str串单词全相等的情况
                    for (int m = 0; m < k; ++m)
                        if (strcmp(pat[pattern[m] - 'a'], temp) == 0)
                        {
                            flag = 0;
                            break;
                        }
                    if (flag) pat[pattern[k] - 'a'] = temp;
                }
                // 给 temp 重新赋值
                temp = (char*)calloc(s_len + 1, sizeof(char));
                j = 0;
                ++k;
            }
            else temp[j++] = str[i];
        }
        // pattern串和str串都匹配到最后，并且最后一个单词也符合
        if (flag && k >= strlen(pattern) && i > s_len)
            ans = true;
    }
    return ans;
}